package com.vviton.zyhj.common.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.UUID;

import com.vviton.zyhj.common.common.CodeConstants;
import com.vviton.zyhj.common.common.GlobalConstants;

/**
 *
 * ClassName: FileUtils <br/>
 * Function: 文件工具类. <br/>
 * Date: 2016年3月10日 下午5:46:29 <br/>
 *
 * @author qiaocf
 * @version 1.0
 * @since JDK 1.7
 */
public final class FileUtils {

    /** 字节大小 **/
    public static final int BUFFER_SIZE = 8192;

    /** 常量 **/
    private static final int SIZE = 2048;

    /** 构造函数 **/
    private FileUtils() {

    }

    /**
     * 根据指定的文件路径和名称,创建临时文件
     *
     * @param filePath
     * @param suffix suffix
     * @return 文件对象
     * @throws IOException
     */
    public static File createFile(String suffix) {
        String uuid = UUID.randomUUID().toString();
        String fileName = uuid + suffix;
        return getTmpFile(fileName);
    }

    /**
     * 保存流信息到文件
     *
     * @param is 输入流
     * @param fileName 文件名
     * @return 文件
     */
    public static File saveTempFileByInputStream(InputStream is, String fileName) {
        File tmpFile = getTmpFile(fileName);
        byte[] dataBuf = new byte[SIZE];
        try {
            BufferedInputStream bis = new BufferedInputStream(is, FileUtils.BUFFER_SIZE);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tmpFile), FileUtils.BUFFER_SIZE);
            int count = 0;
            while ((count = bis.read(dataBuf)) != -1) {
                bos.write(dataBuf, 0, count);
            }
            bos.flush();
            bos.close();
        } catch (IOException e) {
            System.out.println("save temp file failed..");
            e.printStackTrace();
            return null;
        }
        return tmpFile;
    }

    /**
     * 依赖apache临时目录创建文件
     *
     * @param fileName 文件名
     * @return File
     */
    public static File getTmpFile(String fileName) {
        File tmpDir = org.apache.commons.io.FileUtils.getTempDirectory();
        return new File(tmpDir, fileName);
    }

    /**
     * 从文件读取文本信息
     *
     * @param file 文件
     * @return 文本信息
     */
    public static String readTxtFile(File file) {
        return readTxtFile(file, "utf-8");
    }

    /**
     * 从文件读取文本信息,按照指定编码
     *
     * @param file 文件
     * @param encoding 编码
     * @return 文本内容
     */
    private static String readTxtFile(File file, String encoding) {
        String result = "";
        try {
            if (file != null) {
                InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = "";
                while ((lineTxt = bufferedReader.readLine()) != null) {
                    result += lineTxt;
                }
                read.close();
            }
        } catch (Exception e) {
            result = "";
            System.out.print(e.getMessage());
        }
        return result;
    }

    /**
     * 从文件流读取文本信息
     *
     * @param is 输入流
     * @return 文本信息
     */
    public static String readTxtStream(InputStream is) {
        return readTxtStream(is, "utf-8");
    }

    /**
     * 
     * readTxtFileByPath,(根据文件路径获取文件内容). <br/>
     * Author: daizh <br/>
     * Create Date: 2016年5月10日 <br/>
     * ===============================================================<br/>
     * Modifier: daizh <br/>
     * Modify Date: 2016年5月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param filePath
     * @return
     * @since JDK 1.7
     */
    public static String readTxtFileByPath(String filePath) {
        return readTxtFileByPath(filePath, "utf-8");
    }

    /**
     * 
     * readTxtFileByPath,(根据路径和编码读取文件内容). <br/>
     * Author: daizh <br/>
     * Create Date: 2016年5月10日 <br/>
     * ===============================================================<br/>
     * Modifier: daizh <br/>
     * Modify Date: 2016年5月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param filePath
     * @param encoding
     * @return
     * @since JDK 1.7
     */
    public static String readTxtFileByPath(String filePath, String encoding) {
        String result = "";
        try {
            File file = new File(filePath);
            if (file.isFile() && file.exists()) { // 判断文件是否存在
                InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                while ((lineTxt = bufferedReader.readLine()) != null) {
                    result += lineTxt;
                }
                read.close();
            }
        } catch (Exception e) {
            result = "";
            System.out.print(e.getMessage());
        }
        return result;
    }

    /**
     * 从文件流文本信息,按照指定编码
     *
     * @param is 流信息
     * @param encoding 编码
     * @return 文本内容
     */
    private static String readTxtStream(InputStream is, String encoding) {
        String result = "";
        try {
            InputStreamReader read = new InputStreamReader(is, encoding);
            BufferedReader bufferedReader = new BufferedReader(read);
            String lineTxt = "";
            while ((lineTxt = bufferedReader.readLine()) != null) {
                result += lineTxt;
            }
            read.close();
        } catch (Exception e) {
            result = "";
            System.out.print(e.getMessage());
        }
        return result;
    }

    /**
     * 将内容写入文件
     *
     * @param file 文件
     * @param content 内容
     * @return 成功失败
     */
    public static Boolean writeTextFile(File file, String content) {
        return writeTextFile(file, content, "utf-8");
    }

    /**
     * 按照编码将文本写入文件
     *
     * @param file 文件
     * @param content 内容
     * @param encoding 编码
     * @return 成功失败
     */
    public static Boolean writeTextFile(File file, String content, String encoding) {
        try {
            if (file != null && file.exists() && file.isFile()) {
                OutputStreamWriter outWrite = new OutputStreamWriter(new FileOutputStream(file, true), encoding);
                outWrite.write(content);
                outWrite.close();
                return true;
            }
        } catch (Exception e) {
            System.out.print(e.getMessage());
        }
        return false;
    }

    /**
     * 将内容写入临时文件
     *
     * @param fileName 文件名
     * @param content 内容
     * @return 临时文件
     */
    public static File writeTextTempFile(String fileName, String content) {
        return writeTextTempFile(fileName, content, "utf-8");
    }

    /**
     * 
     * writeTextFile,(将文件内容写入指定文件). <br/>
     * Author: daizh <br/>
     * Create Date: 2016年5月10日 <br/>
     * ===============================================================<br/>
     * Modifier: daizh <br/>
     * Modify Date: 2016年5月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param filePath
     * @param content
     * @return
     * @since JDK 1.7
     */
    public static Boolean writeTextFile(String filePath, String content) {
        return writeTextFile(filePath, content, "utf-8");
    }

    /**
     * 
     * writeTextFile,(将文件内容按指定编码写入指定文件). <br/>
     * Author: daizh <br/>
     * Create Date: 2016年5月10日 <br/>
     * ===============================================================<br/>
     * Modifier: daizh <br/>
     * Modify Date: 2016年5月10日 <br/>
     * Modify Description: <br/>
     * ===============================================================<br/>
     * 
     * @param filePath
     * @param content
     * @param encoding
     * @return
     * @since JDK 1.7
     */
    public static Boolean writeTextFile(String filePath, String content, String encoding) {
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                file.createNewFile();
            }
            OutputStreamWriter outWrite = new OutputStreamWriter(new FileOutputStream(file, true), encoding);
            outWrite.write(content);
            outWrite.close();
            return true;
        } catch (Exception e) {
            System.out.print(e.getMessage());
        }
        return false;
    }

    /**
     * 按照编码将文本写入临时文件
     *
     * @param fileName 文件名
     * @param content 内容
     * @param encoding 编码
     * @return 临时文件
     */
    public static File writeTextTempFile(String fileName, String content, String encoding) {
        File file = getTmpFile(fileName);
        try {
            if (StringUtils.isNotBlank(fileName)) {
                OutputStreamWriter outWrite = new OutputStreamWriter(new FileOutputStream(file, true), encoding);
                outWrite.write(content);
                outWrite.close();
            }
            return file;
        } catch (Exception e) {
            System.out.print(e.getMessage());
        }
        return file;
    }

    /**
     * @Desc 通过文件后缀名识别媒体类型
     * @author yaohwu
     * @date 2015年11月19日10:38:57
     * @param fileName 文件全名fileName或后缀名extends(包含‘.’)
     * @return 返回码表媒体类型对应的code值即配置文件中的key值, 文件名不合法返回null
     */
    public static String distFileType(String fileName) {
        try {
            String prefix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
            for (Object obj : GlobalConstants.FILE_KEY_SET) {
                String key = (String) obj;
                if (GlobalConstants.FILE_TYPE_DISTINGUISH.getProperty(key).contains(prefix)) {
                    return key;
                }
            }
            return CodeConstants.MTLX_QT;
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return null;
        }

    }
}
